package smartcampus.scjava.utils;


import java.text.SimpleDateFormat;
import java.util.Random;

/**
 * @author 雨辰YC
 * @date 2023/12/8 1:57
 * @description GetRandom:为了设置创建用户时赋予唯一userID，故设此工具类
 */
public class GetRandomUtils {
    private static final Random random = new Random();

    /**
     * 随机数生成方法: 默认生成时间戳数+随机生成的2位随机数
     * @return userID: 随机生成的随机数，类型为Integer
     */
    public static Integer getRandomInt(){
        int randomNumber =  random.nextInt(90) + 10;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyySSSS");   // 使用时间戳结合随机数，增大随机性
        String date = simpleDateFormat.format(System.currentTimeMillis());
        return Integer.parseInt(date+randomNumber);
    }

    /**
     * 随机数生成方法: 用户指定生成随机数的位数
     * @param number: 用户指定的随机数位数
     * @return : 类型为String，避免int类型范围过小的限制
     */
    public static String getRandomString(int number){
        try {
            int num = getNumber(number);
            Double randomNum = random.nextDouble()*Math.pow(10,num);
            long randomNumber = randomNum.longValue();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyySSSS");   // 使用时间戳结合随机数，增大随机性
            String date = simpleDateFormat.format(System.currentTimeMillis());
            return date+randomNumber;
        } catch (GetNumberException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 判断用户输入随机数位数是否合适方法:
     * @param number: 用户指定的随机数位数
     * @return number: 用户指定的随机数位数
     * @throws GetNumberException
     */
    private static int getNumber(int number) throws GetNumberException {
        if (number<1){
            throw new GetNumberException("输入位数有误number不可小于1");
        }else {
            return number;
        }
    }

    /**
     * 自定义异常类：处理用户输入随机数位数异常
     */
    static class GetNumberException extends Exception{
        public GetNumberException() {
        }

        public GetNumberException(String message) {    // 创建异常时将原因写入
            super(message);
        }

        public GetNumberException(String message, Throwable cause) {
            super(message, cause);
        }

        public GetNumberException(Throwable cause) {
            super(cause);
        }

        public GetNumberException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
            super(message, cause, enableSuppression, writableStackTrace);
        }
    }
}
